1
|
|
|
import React from "react" |
2
|
|
|
import { classNamesCheck } from "./check" |
3
|
|
|
import { EMPTY_OBJECT } from "./consts" |
4
|
|
|
import { ClassHash, ClassNamesProperty, CssModule } from "./defs" |
5
|
|
|
|
6
|
|
|
export {} |
7
|
|
|
|
8
|
|
|
type ComponentClassNames = {App: ClassHash} |
9
|
|
|
const Component = ({classnames: {App}}: ClassNamesProperty<ComponentClassNames>) => <div className={App}/> |
10
|
|
|
|
11
|
|
|
const css_module_exact = { |
12
|
|
|
App: undefined |
13
|
|
|
} //as {App: string|undefined} |
14
|
|
|
, css_module = { |
15
|
|
|
App: undefined, |
16
|
|
|
"never-used": "bad" |
17
|
|
|
} |
18
|
|
|
|
19
|
|
|
it(classNamesCheck.name, () => { |
20
|
|
|
<Component classnames={classNamesCheck()} />; |
21
|
|
|
//@ts-expect-error Property 'App' is missing |
22
|
|
|
<Component classnames={classNamesCheck({})} />; |
23
|
|
|
<Component classnames={classNamesCheck(css_module_exact)} />; |
24
|
|
|
<Component classnames={classNamesCheck(css_module)} />; |
25
|
|
|
<Component classnames={classNamesCheck(css_module_exact, {} as ComponentClassNames)} />; |
26
|
|
|
<Component classnames={classNamesCheck<ComponentClassNames, typeof css_module_exact>(css_module_exact)} />; |
27
|
|
|
<Component classnames={classNamesCheck( |
28
|
|
|
css_module, |
29
|
|
|
//@ts-expect-error Property 'never-used' is missing |
30
|
|
|
{} as ComponentClassNames) |
31
|
|
|
} />; |
32
|
|
|
|
33
|
|
|
//@ts-expect-error Type 'CssModule' is not assignable to type |
34
|
|
|
<Component classnames={classNamesCheck< |
35
|
|
|
ComponentClassNames |
36
|
|
|
>(css_module)} />; |
37
|
|
|
|
38
|
|
|
<Component classnames={classNamesCheck< |
39
|
|
|
//@ts-expect-error Type 'ComponentClassNames' does not satisfy the constraint |
40
|
|
|
ComponentClassNames, |
41
|
|
|
typeof css_module |
42
|
|
|
>(css_module)} />; |
43
|
|
|
|
44
|
|
|
expect(true).toBe(true) |
45
|
|
|
}) |
46
|
|
|
|
47
|
|
|
it("research", () => { |
48
|
|
|
//@ts-expect-error Property 'App' is missing |
49
|
|
|
<Component classnames={{} as Record<string, ClassHash>} />; |
50
|
|
|
<Component classnames={{} as never} />; |
51
|
|
|
<Component classnames={{} as any} />; |
52
|
|
|
//@ts-expect-error Type 'unknown' is not assignable |
53
|
|
|
<Component classnames={{} as unknown} />; |
54
|
|
|
<Component classnames={{App: undefined, |
55
|
|
|
//@ts-expect-error Object literal may only specify known properties, and 'App__bad' does not exist |
56
|
|
|
App__bad: "bad" |
57
|
|
|
}} />; |
58
|
|
|
<Component classnames={css_module} />; |
59
|
|
|
<Component classnames={css_module as ComponentClassNames} />; |
60
|
|
|
expect(true).toBe(true) |
61
|
|
|
}) |
62
|
|
|
|
63
|
|
|
it("check", () => { |
64
|
|
|
function check0< |
65
|
|
|
//@ts-expect-error |
66
|
|
|
C extends T, |
67
|
|
|
T extends CssModule = CssModule>(source = EMPTY_OBJECT as T) { |
68
|
|
|
return source |
69
|
|
|
} |
70
|
|
|
|
71
|
|
|
// function check0<C extends T, T extends CssModule = CssModule>(source = EMPTY_OBJECT as T) :C { |
72
|
|
|
// return source as C |
73
|
|
|
// } |
74
|
|
|
|
75
|
|
|
<Component classnames={check0()} />; |
76
|
|
|
//@ts-expect-error Property 'App' is missing |
77
|
|
|
<Component classnames={check0({})} />; |
78
|
|
|
<Component classnames={check0(css_module_exact)} />; |
79
|
|
|
//TODO #16 @ts-expect-error |
80
|
|
|
<Component classnames={check0(css_module)} />; |
81
|
|
|
|
82
|
|
|
//@ts-expect-error Property 'App' is missing in type 'CssModule' |
83
|
|
|
<Component classnames |
84
|
|
|
={check0<ComponentClassNames>(css_module)} />; |
85
|
|
|
|
86
|
|
|
<Component classnames={check0< |
87
|
|
|
//@ts-expect-error Property 'never-used' is missing in type 'ComponentClassNames' |
88
|
|
|
ComponentClassNames, |
89
|
|
|
typeof css_module |
90
|
|
|
>(css_module)} />; |
91
|
|
|
|
92
|
|
|
function check2<T extends CssModule = CssModule, C extends {[K in keyof T]: ClassHash} = T>( |
93
|
|
|
source = EMPTY_OBJECT as T, |
94
|
|
|
_ = EMPTY_OBJECT as C |
95
|
|
|
) {return source} |
96
|
|
|
|
97
|
|
|
<Component classnames={check2()} />; |
98
|
|
|
//@ts-expect-error Property 'App' is missing |
99
|
|
|
<Component classnames={check2({})} />; |
100
|
|
|
<Component classnames={check2(css_module_exact, {} as ComponentClassNames)} />; |
101
|
|
|
<Component classnames={check2<typeof css_module_exact, ComponentClassNames>(css_module_exact)} />; |
102
|
|
|
<Component classnames={check2(css_module, |
103
|
|
|
//@ts-expect-error Property 'never-used' is missing |
104
|
|
|
{} as ComponentClassNames) |
105
|
|
|
} />; |
106
|
|
|
<Component classnames={check2< |
107
|
|
|
typeof css_module, |
108
|
|
|
//@ts-expect-error Type 'ComponentClassNames' does not satisfy the constraint |
109
|
|
|
ComponentClassNames |
110
|
|
|
>(css_module)} />; |
111
|
|
|
|
112
|
|
|
expect(true).toBe(true) |
113
|
|
|
}) |
114
|
|
|
|